package movilmax.sia_corp.action;

import java.util.LinkedList;
import java.util.Map;

import utilidades.Cadena;

import movilmax.sia_corp.model.Pagos;
import movilmax.sia_corp.model.Usuario;
import apli.conectar.Conectar;
import apli.procesos.PWimax;
import apli.validaciones.Validar;
import apli.entidades.*;
import basedatos.BaseDatos;
import basedatos.Fecha;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class VentaTarjetas extends ActionSupport{
	private String codigobarras;
	private Pagos pago;
	private static final long serialVersionUID = 7532281457269424770L;
	
	
	@SuppressWarnings("rawtypes")
	public void validate(){	
		Map session = ActionContext.getContext().getSession();
    	Usuario USUARIO = (Usuario) session.get("ses_usuario");
    	if(USUARIO==null){
			this.addActionError("La sesion del usuario ha caducado" ); 
			return;
		}
		try{
			
			Conectar BASE=new Conectar();
			if(BASE.getMsg().equals("SI")){
				Validar VX = new Validar(BASE.getBaseDatos());
				String rp_vt=VX.validarCBarras(this.getCodigobarras(), USUARIO.getSucursal().getCod());
				if(!rp_vt.equals("1") ){
					if(rp_vt.equals("-1")){
					   this.addActionError("Error al validar el codigo de barras no registrado");
					}
					if(rp_vt.equals("2")){
					   this.addActionError("Codigo de barras no registrado");
					}
					if(rp_vt.equals("3")){
					   this.addActionError("Codigo de barras no disponible");
					}
					if(rp_vt.equals("4")){
					   this.addActionError("Codigo de barras no asignado a la sucursal");
					}
					return;
				}
				Tarjetas tarjeta=VX.getCBarras(this.getCodigobarras(), USUARIO.getSucursal().getCod());
				String rp_=this.validarMontoPago(BASE.getBaseDatos(),tarjeta);
				if(!rp_.equals("SI")){
					this.addActionError(rp_);
					return;
				}	
			}else{
				this.addActionError("No hay conexion al servidor");
				return;
			}
		}catch(Exception err){
			err.printStackTrace();
		}
	}
	@SuppressWarnings("rawtypes")
	public String venderTarjeta(){
		Map session = ActionContext.getContext().getSession();
    	Usuario USUARIO = (Usuario) session.get("ses_usuario");
    	if(USUARIO==null){
			this.addActionError("La sesion del usuario ha caducado" ); 
			return ERROR;
		}
		Fecha F= new Fecha();
		String cod_venta="";
		Conectar BASE=new Conectar();
		if(BASE.getMsg().equals("SI")){
			 cod_venta=BASE.getBaseDatos().generarCodigo("venta_tarjetas", "codigo");
			 PWimax P = new PWimax(BASE.getBaseDatos());
			 String nroControl=P.generarNumeroControlTar(USUARIO.getSucursal().getCod());
			 Validar VX = new Validar(BASE.getBaseDatos());
			 Tarjetas tarjeta=VX.getCBarras(this.getCodigobarras(), USUARIO.getSucursal().getCod());
			 
				String SQL="INSERT INTO venta_tarjetas(codigo,nro_control,fecha,hora,usuario,total,sucursal,empresa) " +
				           "VALUES ('" + cod_venta + "','" + nroControl + "','" + F.getFecha()+ "','" + F.getHoras() + "','" + USUARIO.getUsuario() + "','" + tarjeta.getMonto() + "','" + USUARIO.getSucursal().getCod() + "','1' ) ";       
				if(BASE.getBaseDatos().ejecutar(SQL)){
					SQL="UPDATE sucursales SET ctd_ctr_actual_venta_tar=ctd_ctr_actual_venta_tar+1 where cod='"+ USUARIO.getSucursal().getCod() +"' ";
					BASE.getBaseDatos().ejecutar(SQL);
					this.GuardarArticulos(BASE.getBaseDatos(),cod_venta, tarjeta);			
					this.GuardarFormasPago(BASE.getBaseDatos(),cod_venta,tarjeta.getMonto());
					this.setCodigobarras("");
					this.addActionMessage("Venta registrada bajo el numero de control="+nroControl);
				}else{
					this.addActionError("No se pudo registrar la venta de la tarjeta");
					BASE.getBaseDatos().cerrarConexion();
					return ERROR;
				}
			    BASE.getBaseDatos().cerrarConexion();
		}else{
			this.addActionError("No hay conexion al servidor");
			return ERROR;
		}
		return SUCCESS;
	}

	@SuppressWarnings("rawtypes")
	public String GuardarArticulos(BaseDatos BASE, String cod, Tarjetas tarjeta ){
		Map session = ActionContext.getContext().getSession();
    	Usuario USUARIO = (Usuario) session.get("ses_usuario");
    	if(USUARIO==null){
			this.addActionError("La sesion del usuario ha caducado" ); 
			return ERROR;
		}	
    	String SQL="";
		Fecha F = new Fecha();
		SQL = "INSERT INTO detalle_ventas_tarjeta(nro_factura,articulo,serial,cantidad,monto_base,alicuota,descuento,sub_det) " +
              " VALUES ('" + cod + "','" + tarjeta.getCodigo() + "','" + tarjeta.getCBarras() + "','1','" + tarjeta.getMonto() + "','0','0','TARJETA MOVILPAY " + tarjeta.getCBarras() + "' ) ";
		BASE.ejecutar(SQL);
		SQL="UPDATE tarjetas set ult_cambio_fecha='" + F.getFecha() + "',ult_cambio_hora='" + F.getHoras() + "',ult_cambio_usu='" + USUARIO.getUsuario() + "',status='5'  " +
                " Where cod='" + tarjeta.getCodigo() + "' ";
		BASE.ejecutar(SQL);
		return "ok";
	}
	
	
	@SuppressWarnings("rawtypes")
	public String GuardarFormasPago(BaseDatos BASE,String cod,float monx ){
		Map session = ActionContext.getContext().getSession();
    	Usuario USUARIO = (Usuario) session.get("ses_usuario");
    	if(USUARIO==null){
			this.addActionError("La sesion del usuario ha caducado" ); 
			return ERROR;
		}
    	String SQL="";
		Fecha F = new Fecha();
		Cadena C = new Cadena();
  	    String mon= C.convertirStr(monx).replace("'",".");
  	    SQL = "INSERT INTO detalle_pagos_venta(factura,forma_pago,monto,nro_transaccion,nro_conformacion,banco,punto_venta,usuario_registro,fecha_registro,hora_registro,fecha,sucursal_pago) " +
  	    	  "VALUES ('" + cod + "','1','" + mon + "','.','','0','0','" + USUARIO.getUsuario()+ "','" + F.getFecha() + "','" + F.getHoras() + "','" + F.getFecha() + "','" + USUARIO.getSucursal().getCod() + "' ) ";
		    	if (BASE.ejecutar(SQL)) {
		    	    this.addActionMessage("Pago registrado" );
		    	    return "ok";
		    	}
		return "no";
	}
	
	@SuppressWarnings("rawtypes")
	public String validarMontoPago(BaseDatos BASE,Tarjetas tarjeta){
		Map session = ActionContext.getContext().getSession();
    	Usuario USUARIO = (Usuario) session.get("ses_usuario");
    	if(USUARIO==null){
			this.addActionError("La sesion del usuario ha caducado" ); 
			return "La sesion del usuario ha caducado";
		}
		Cadena C = new Cadena();
    	double totalPagos =0.00;
			LinkedList lst_for=C.tokens(getPago().getForma(),",");
  	    	LinkedList lst_mon=C.tokens(getPago().getMonto(),",");
  	    	int i=0;
  	    	for(i=0; i<lst_for.size();i++){
  	    		String fpa=lst_for.get(i).toString();
  	    		String mon=lst_mon.get(i).toString().replace(",",".");
  	    		if(!fpa.equals("-1") && !mon.equals("") ){
  	    			totalPagos= totalPagos+ C.convertirDoble(mon);
  	    		}
  	    	}
  	     if(tarjeta.getMonto()== totalPagos){
  	    	 return "SI";
  	     }else{
  	    	 return "El monto del pago ="+totalPagos+", debe ser igual al monto de la tarjeta ="+tarjeta.getMonto();
  	     }
	}
	
	
	
	public Pagos getPago() {
		return pago;
	}
	public void setPago(Pagos pago) {
		this.pago = pago;
	}
	public String getCodigobarras() {
		return codigobarras;
	}
	public void setCodigobarras(String codigobarras) {
		this.codigobarras = codigobarras;
	}
	

}
